package tests;

import static org.junit.Assert.*;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Map.Entry;

import org.junit.BeforeClass;
import org.junit.Test;

import domein.Account;
import domein.AutoTotaalDiensten;
import domein.Klant;
import domein.ParkeerPlaats;
import domein.ParkeerTerrein;

public class UnitTest {

	@BeforeClass
	public static void fillUsers() {
		Klant nieuweKlant = new Klant();
		nieuweKlant.setEmail("piet.hein@mail.com");
		nieuweKlant.setVoornaam("Piet");
		nieuweKlant.setAchternaam("Hein");
		nieuweKlant.setAdres("Kanaalstraat 21");
		nieuweKlant.setWoonplaats("Utrecht");
		try {
			nieuweKlant.setGeboorte("12-03-1975");
		} catch (ParseException e) {
			e.printStackTrace();
		}
		Account nieuwAccount = new Account(nieuweKlant, "8272732", "8272732");
		AutoTotaalDiensten.registreer(nieuweKlant, nieuwAccount);

		Klant nieuweKlant2 = new Klant();
		nieuweKlant.setEmail("keen.jansen@mail.com");
		nieuweKlant.setVoornaam("Piet");
		nieuweKlant.setAchternaam("Hein");
		nieuweKlant.setAdres("Kanaalstraat 21");
		nieuweKlant.setWoonplaats("Utrecht");
		Account nieuwAccount2 = new Account(nieuweKlant, "9293833", "9293833");
		AutoTotaalDiensten.registreer(nieuweKlant, nieuwAccount);
	}

	@Test
	public void loginTest() {
		if (!(AutoTotaalDiensten.login("piet.hein@mail.com", "8272732") != null)) {
			fail("Inloggen mislukt");
		}
	}

	@Test
	public void onbekendeLoginTest() {
		if (AutoTotaalDiensten.login("klaas.keesen@mail.com", "9383939") != null) {
			fail("Onbekende gebruiker kan inloggen");
		}
	}

	@Test
	public void zonderWachtwoordLoginTest() {
		if (AutoTotaalDiensten.login("keen.jansen@mail.com", "") != null) {
			fail("Gebruiker kan inloggen zonder wachtwoord");
		}
	}

	@Test
	public void registreerGebruikteEmailTest() {
		try {
			Klant nieuweKlant = new Klant();
			nieuweKlant.setEmail("piet.hein@mail.com");
			nieuweKlant.setVoornaam("Piet");
			nieuweKlant.setAchternaam("Hein");
			nieuweKlant.setAdres("Kanaalstraat 21");
			nieuweKlant.setWoonplaats("Utrecht");
			Account nieuwAccount = new Account(nieuweKlant, "8272732",
					"8272732");
			AutoTotaalDiensten.registreer(nieuweKlant, nieuwAccount);
			fail("Gebruiker kan met een algebruikt emailadres registreren.");
		} catch (IllegalArgumentException e) {

		}
	}

	@Test
	public void registreerTest() {
		Klant nieuweKlant = new Klant();
		nieuweKlant.setEmail("klaas.keesen@mail.com");
		nieuweKlant.setVoornaam("Klaas");
		nieuweKlant.setAchternaam("Keesen");
		nieuweKlant.setAdres("Biltstraat 22");
		nieuweKlant.setWoonplaats("Utrecht");
		Account nieuwAccount = new Account(nieuweKlant, "9383939", "9383939");
		try {
			AutoTotaalDiensten.registreer(nieuweKlant, nieuwAccount);
		} catch (IllegalArgumentException e) {
			fail(e.toString());
		}
	}

	@Test
	public void registreerZonderVeldenTest() {
		Klant nieuweKlant = new Klant();

		try {
			nieuweKlant.setEmail("henk.peterse@mail.com");
			nieuweKlant.setVoornaam("Henk");
			nieuweKlant.setAchternaam("Peterse");
			nieuweKlant.setAdres(null);
			nieuweKlant.setWoonplaats(null);
			Account nieuwAccount = new Account(nieuweKlant, "9234342",
					"9234342");
			AutoTotaalDiensten.registreer(nieuweKlant, nieuwAccount);
			fail("Registratie met lege velden mogelijk");
		} catch (IllegalArgumentException e) {
			// fail(e.toString());
		}
	}

	@Test
	public void registreerKortWachtwoordTest() {

		try {
			Klant nieuweKlant = new Klant();
			nieuweKlant.setEmail("kees.jan@mail.com");
			nieuweKlant.setVoornaam("Kees");
			nieuweKlant.setAchternaam("Jan");
			nieuweKlant.setAdres("Dorpsstaat 22");
			nieuweKlant.setWoonplaats("Houten");
			Account nieuwAccount = new Account(nieuweKlant, "99238", "99238");
			AutoTotaalDiensten.registreer(nieuweKlant, nieuwAccount);
			fail("Registratie met kort wachtwoord mogelijk");
		} catch (IllegalArgumentException e) {

		}
	}

	@Test
	public void registreerVerschillendWachtwoordTest() {

		try {
			Klant nieuweKlant = new Klant();
			nieuweKlant.setEmail("nathalie.dijk@mail.com");
			nieuweKlant.setVoornaam("Nathalie");
			nieuweKlant.setAchternaam("Dijk");
			nieuweKlant.setAdres("Plantsoen 77");
			nieuweKlant.setWoonplaats("Groningen");
			Account nieuwAccount = new Account(nieuweKlant, "9292999",
					"8283838");
			AutoTotaalDiensten.registreer(nieuweKlant, nieuwAccount);
			fail("Registratie met verschillende wachtwoorden mogelijk");
		} catch (IllegalArgumentException e) {

		}
	}

	@Test
	public void reserveerCorrectTest() {
		try {	
			for(Entry<String, ParkeerPlaats> p : ParkeerTerrein.getBezetteParkeerplaatsen().entrySet()) {
				if (p.getValue().isBezet()){
					p.getValue().setBezet(false);
				}
			}
		} catch (IllegalArgumentException e) {

		}
	}
	
	@Test
	public void maakVrijCorrectTest() {
		try {	
			for(Entry<String, ParkeerPlaats> p : ParkeerTerrein.getBezetteParkeerplaatsen().entrySet()) {
				if (p.getValue().isBezet()){
					p.getValue().setBezet(true);
				}
			}
		} catch (IllegalArgumentException e) {

		}
	}

	/*
	 * Hier beginnen de zoek klant tests, beginnend met de correcte tests
	 */

	@Test
	public void zoekKlantCorrecteVoornaamTest() {
		String naam = "Piet";
		for (Klant k : AutoTotaalDiensten.getKlanten()) {
			if(k.getNaam().equals(naam)){
				System.out.println("Klant " + k.getNaam() + k.getAchterNaam() + " met geboortedatum " 
						+ k.getGeboorteString() + " gevonden.");
			}
		}
	}

	@Test
	public void zoekKlantCorrecteAchternaamTest() {
		String achternaam = "Hein";
		for (Klant k : AutoTotaalDiensten.getKlanten()) {
			if(k.getAchterNaam().equals(achternaam)){
				System.out.println("Klant " + k.getNaam() + k.getAchterNaam() + " met geboortedatum " 
						+ k.getGeboorteString() + " gevonden.");
			}
		}
	}

	@Test
	public void zoekKlantCorrecteGeboortedatumTest() {
		String geboortedatum = "12-03-1975";
		for (Klant k : AutoTotaalDiensten.getKlanten()) {
			if(k.getGeboorteString().equals(geboortedatum)){
				System.out.println("Klant " + k.getNaam() + k.getAchterNaam() + " met geboortedatum " 
						+ k.getGeboorteString() + " gevonden.");
			}
		}
	}

	/*
	 * Nu komen de incorrecte tests van klant zoeken
	 */

	@Test
	public void zoekKlantFouteVoornaamTest() {
		String naam = "Jan";
		for (Klant k : AutoTotaalDiensten.getKlanten()) {
			if(k.getNaam().equals(naam)){
				System.out.println("Klant " + k.getNaam() + k.getAchterNaam() + " met geboortedatum " 
						+ k.getGeboorteString() + " gevonden.");
			} else {
				System.out.println("Geen klant gevonden.");
			}
		}
	}

	@Test
	public void zoekKlantFouteAchternaamTest() {
		String achternaam = "Janssen";
		for (Klant k : AutoTotaalDiensten.getKlanten()) {
			if(k.getAchterNaam().equals(achternaam)){
				System.out.println("Klant " + k.getNaam() + k.getAchterNaam() + " met geboortedatum " 
						+ k.getGeboorteString() + " gevonden.");
			} else {
				System.out.println("Geen klant gevonden.");
			}
		}
	}

	@Test
	public void zoekKlantFouteGeboortedatumTest() {
		String geboortedatum = "12-03-1980";
		for (Klant k : AutoTotaalDiensten.getKlanten()) {
			if(k.getGeboorteString().equals(geboortedatum)){
				System.out.println("Klant " + k.getNaam() + k.getAchterNaam() + " met geboortedatum " 
						+ k.getGeboorteString() + " gevonden.");
			} else {
				System.out.println("Geen klant gevonden.");
			}
		}
	}

	@Test
	public void zoekKlantGeenGegevensIngevuldTest() {
		String naam="";
		for (Klant k : AutoTotaalDiensten.getKlanten()) {
			if(k.getNaam().equals(naam)){
				System.out.println("Klant " + k.getNaam() + k.getAchterNaam() + " met geboortedatum " 
						+ k.getGeboorteString() + " gevonden.");
			} else if (naam == null){
				System.out.println("Geen gegevens ingevuld.");
			}
		}
	}

}
